package com.easyim.imserver.handler.cmd;

import com.easyim.common.message.Immessage;
import com.easyim.imserver.handler.message.Handler;
import io.netty.channel.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import static com.easyim.imserver.constant.CacheKey.ACTIVE_TIME;

@Component
@Slf4j
public class PingHandler implements Handler {
    @Override
    public String dealType() {
        return Immessage.CmdMessage.CommandType.PING.name();
    }

    /**
     * 对于ping命令。我们多久检查一次？定时任务检查 还是怎么办？还是直接放进去redis
     *
     * 如果客户端网极差 没发出来怎么办 内存中的map肯定是需要更新的 如何做实现redis的定时功能才是问题
     *
     * 定时任务 扫描所有channel 如果 当前时间 - 心跳上次活跃时间 > 设置的阈值。说明连接已经失活了 这时候尝试发一个ping
     * 如果可以发送成功 暂时不理他 发送失败 直接剔除！
     * 存储在channel的attr
     * 客户端逻辑 遇到ping 回ping
     * 遇到pong丢弃
     * 服务端 遇到ping pong 都是更新心跳时间
     *
     *
     * @param channel
     * @param imMessage
     */
    @Override
    public void handlerMsg(Channel channel, Immessage.ImMessage imMessage) {
        channel.attr(ACTIVE_TIME).set(System.currentTimeMillis());
        //todo 返回一个PONG消息
    }
}
